<?php
/*
 * Clase para la Conexion a MySQL desde php 4 y con drivers viejos (sin MySQLI)
 * Jonas Reyes - 19-07-2009
 */
class BD2 {
    public $nombreServidorBD;
    public $nombreUsuarioBD;
    public $claveUsuarioBD;
    public $nombreBD;
    public $punteroBD; // muy importante esta variable, mantiene el link de la conexion establecida
    public $resultado;
    public $querys;
    public $array; // conserva en un array la ultima consulta.
    public $numFilas;
    public $numColumnas;
    public $setCharset;
    public $stmt_init;
    public $fetchField;

    function __construct($Serv=SERV,$User=US_BD,$Pass=US_PASS,$Bd=NOM_BD) {
        $this->SetNombreServidorBD($Serv);
        $this->SetNombreUsuarioBD($User);
        $this->SetClaveBD($Pass);
        $this->SetNombreBD($Bd);
        if ($this->Conectar()) {
            return true;
        }else {
            return Core::MsgError("Error, no se pudo establecer la conexion con la Base de Datos.");
        }
       
    }//Fin del Constructor


    public function stmt_init(){
        if ($var=$this->punteroBD->stmt_init()) {
            
            return $this->stmt_init;
        }
        return false;
    }

    public function SetNombreServidorBD($nombre=SERV){
        $this->nombreServidorBD=$nombre;
    }
    public function GetNombreServidorBD(){
        return $this->nombreServidorBD;
    }

    public function SetNombreUsuarioBD($usuario=US_BD){
        $this->nombreUsuarioBD=$usuario;
    }
    public function GetNombreUsuarioBD(){
        return $this->nombreUsuarioBD;
    }

    public function SetClaveBD($clave=US_PASS){
        $this->claveUsuarioBD=$clave;
    }
    public function GetClaveBD(){
        return $this->claveUsuarioBD;
    }

    public function SetNombreBD($nombreBD=NOM_BD){
        $this->nombreBD=$nombreBD;
    }
    public function GetNombreBD(){
        return $this->nombreBD;
    }

    public function Conectar($Serv=SERV,$User=US_BD,$Pass=US_PASS,$Bd=NOM_BD){
        if ($this->punteroBD=mysql_pconnect($Serv, $User, $Pass)) {
            if (mysql_select_db($Bd, $this->punteroBD)) {
                return true;
            }else {
                Core::MsgError("No se pudo realizar la conexion con la BD.");
            }
        }else {
            return Core::MsgError("Error, ha fallado la conexion con mysql, "
                ."por favor verifique sus datos de conexion en el archivo "
                ."'configuracion/Configuracion.php'. "
                ."Error de MySQL: ".mysql_errno()." - ".mysql_error());
        }

    }//Fin del Metodo

    /**
     * Metodo que retorna el tipo de caracteres usados por defectos en la BD.
     */
    public function GetCharset(){
        $charset=mysql_client_encoding($this->punteroBD);
        return $charset;
    }// fin del metodo

/**
 *Asigna la codificación de caráteres por defectos para la actual conexión al a BD.
 * @param String $charset Cadena de texto que identifica el patron de codificación a usar.
 * @return Booleano
 */
    public function setCharset($charset = null) {
        if (!$charset) {
            if (mysql_set_charset('utf-8', $this->punteroBD)) {
                return true;
            }else {
                return false;
            }
        }else {
            if (mysql_set_charset($charset, $this->punteroBD)) {
                return true;
            }else {
                return false;
            }
        }
    }


/**
 * Metodo que devuelve los resultados de una consulta en arrays asociativos
 * y / o numericos.
 * @param Char $tipoResp caracter que define el tipo de la respuesta, pueden ser [A=Asociativo (por defecto), N= Numerico]
 */
    public function Fetch($tipoResp="A"){
// Validaciones básicas
        if (!Core::ValidacionBasica($this->resultado,1)) {//Validamos que haya previamente una consulta.
            return Core::MsgError("Error, para poder usar el metodo 'Fetch()'"
                ." debe haber realizado una consulta con el metodo 'Query()' "
                ."previamente.");
        }// si no se cumple este error continuamos la ejecusion del codigo.
        if (!Core::ValidacionBasica($tipoResp)) {
            return Core::MsgError("Error, en el metodo 'Fetch()' el parametro "
            ."'\$tipoResp' no puede definirse vacio. Las Opciones para la "
            ."definicion de este parametro son los caracteres 'A', 'N' y 'O', "
            ."donde 'A' indica al metodo que la respuesta debe ser un array Asociativo, "
            ."'N' indica que debe ser un array Numerico y 'O' que debe ser de Objetos.");
        }// si no se cumple este error continuamos la ejecusion del codigo.
        //$this->Conectar();
        if ($tipoResp=="A" || $tipoResp=="a") {
            @$array=mysql_fetch_assoc($this->resultado);
            return $array;
        }elseif ($tipoResp=="N" || $tipoResp=="n") {
            $array=mysql_fetch_array($this->resultado,MYSQL_NUM);
            return $array;
        }elseif ($tipoResp=="O" || $tipoResp=="o") {
            $objeto=mysql_fetch_object($this->resultado);
            return $objeto;
        }else {
            return Core::MsgError("Error, en el metodo 'Fetch()' el parametro "
            ."'\$tipoResp' solo puede contener uno de las tres (3) caracteres"
            ." permitidos: [A(asociativo),N(numerico),O(objeto)]");
        }

    }// Fin del Metodo

public function Query ($sql)
	{
	/*if (!Core::ValidacionBasica($sql)) {
            return Core::MsgError("Error, en el metodo 'Fetch()' el parametro "
            ."'\$query' no puede definirse vacio.");
        }// si no se cumple este error continuamos la ejecusion del codigo.
*/

     // Para determinar el sumero de consultas que ha realizado el objeto.
    $this->querys++;
     // Borrando espacios blancos y caracteres de saltos antes al principio y final de la cadena.
    $sql=trim($sql);

    // $sql = mysql_real_escape_string($sql);
    // Al parecer es mas eficiente usarlo sobre variables especificas o
    // datos provenientes de campos formularios.

    // Escapando Comillas en caso que el servidor tenga deshabilitado el escape automatico.
    if (!get_magic_quotes_gpc()) {// si el servidor no escapa automaticamente los slashes
      $sql= addslashes($sql);
      }

    if ($resultado_auxiliar=mysql_query($sql, $this->punteroBD)) {
        $this->resultado=$resultado_auxiliar;
        return $this->resultado;
    }else {
        return Core::MsgError("Error, no se pudo procesar su consulta en la "
            ."Base de Datos. "
            ."Mensaje de MySQL: ".mysql_errno()." - ".mysql_error());
    }
}// Fin del metodo

/**
 * Devuelve el numero total de filas o registros obtenidos en la consulta mas reciente
 * de la tabla pasada como parametro, o la ultima tabla afectada en caso de no haber definido tal
 * parametro. En caso de no existir la tabla o de ocurrir un error, se devuelve
 * una cadena de explicacion.
 * @param string $nombreTabla define el nombre de la tabla sobre la cual se desea obtener el numero de filas o registros.
 * @return Integer
 */
public function NumFilas($nombreTabla="Default"){
    // Validaciones básicas
        if (!Core::ValidacionBasica($nombreTabla)) {
        return Core::MsgError("Error, el metodo 'NumFilas()' debe poseer un parametro valido."
            ." Si UD. invoca el metodo sin pasar un atributo, obtendrá "
            ."los resultados en base a la tabla afectada en la ultima consulta realizada por el objeto.");
    }elseif ($nombreTabla=="Default") {
        if (!Core::ValidacionBasica($this->resultado,1)) {//Validamos que haya previamente una consulta.
            return Core::MsgError("Error, para poder usar el metodo 'NumFilas()'"
                ." debe haber realizado una consulta con el metodo 'Query()' "
                ."previamente, O invocar el metodo indicando el nombre de la tabla como parametro.");
                }
        $this->numFilas=mysql_num_rows($this->resultado);
        return $this->numFilas;
    }else {
        $sql_auxiliar="SELECT * FROM $nombreTabla";
        if ($resultado_auxiliar=$this->Query($sql_auxiliar)) {
            $this->numFilas=mysql_num_rows($this->resultado);
            return $this->numFilas;
        }else {
            return Core::MsgError("Error, la tabla '$nombreTabla' pasada como "
                ."parametro al metodo 'NumFilas()' no existe. "
                ."Mensaje de MySQL: ".mysql_errno()." - ".mysql_error());
        }
    }       
}//Fin del Metodo

/**
 * Devuelve el numero de columnas o campos de la tabla pasada como
 * parametro o la ultima tabla consultada en caso de no haber definido tal
 * parametro. En caso de no existir la tabla o de ocurrir un error, se devuelve
 * una cadena de explicacion.
 * @param string $nombreTabla define el nombre de la tabla sobre la cual se desea obtener el numero de columnas o campos.
 * @return Integer Representa el numero de columnas contenidas en la tabla de la ultima consulta realizada.
 */
public function NumColumnas($nombreTabla="Default"){
    // Validaciones básicas
        if (!Core::ValidacionBasica($nombreTabla)) {
        return Core::MsgError("Error, el metodo 'NumColumnas()' debe poseer un parametro valido."
            ." Si UD. invoca el metodo sin pasar un atributo, obtendrá "
            ."los resultados en base a la tabla afectada en la ultima consulta realizada por el objeto.");
    }elseif ($nombreTabla=="Default") {
        if (!Core::ValidacionBasica($this->resultado)) {//Validamos que haya previamente una consulta.
            return Core::MsgError("Error, para poder usar el metodo 'NumColumnas()'"
                ." debe haber realizado una consulta con el metodo 'Query()' "
                ."previamente, O invocar el metodo indicando el nombre de la tabla como parametro.");
                }
        $this->numColumnas=mysql_num_fields($this->resultado);
        return $this->numColumnas;
    }else {
        $sql_auxiliar="SELECT * FROM $nombreTabla";
        if ($resultado_auxiliar=$this->Query($sql_auxiliar)) {
            $this->numColumnas=mysql_num_fields($this->resultado);
            return $this->numColumnas;
        }else {
            return Core::MsgError("Error, la tabla '$nombreTabla' pasada como "
                ."parametro al metodo 'NumColumnas()' no existe. "
                ."Mensaje de MySQL: ".mysql_errno($this->punteroBD)." - ".mysql_error($this->punteroBD));
        }
    }

}// Fin de Metodo

public function Afectados($puntero="DEFAULT") {
    if ($puntero=="DEFAULT") {
        return mysql_affected_rows($this->punteroBD);
    }else {
        return mysql_affected_rows($puntero);
    }
}

public function FetchField($nombreTabla="Default"){
    // Validaciones básicas
        if (!Core::ValidacionBasica($nombreTabla)) {
        return Core::MsgError("Error, el metodo 'FetchField()' debe poseer un parametro valido."
            ." Si UD. invoca el metodo sin pasar un atributo, obtendrá "
            ."los resultados en base a la tabla afectada en la ultima consulta realizada por el objeto.");
    }elseif ($nombreTabla=="Default") {
        if (!Core::ValidacionBasica($this->resultado)) {//Validamos que haya previamente una consulta.
            return Core::MsgError("Error, para poder usar el metodo 'FetchField()'"
                ." debe haber realizado una consulta con el metodo 'Query()' "
                ."previamente, O invocar el metodo indicando el nombre de la tabla como parametro.");
                }

        $tempNum = $this->NumColumnas();
        $i=0;
        $meta;
        while($i < $tempNum){
            $meta[]=array(mysql_fetch_field($this->resultado, $i));
            $i++;
        }
        $this->fetchField=$meta;
        return $this->fetchField;
    }else {
        $sql_auxiliar="SELECT * FROM $nombreTabla";
        if ($resultado_auxiliar=$this->Query($sql_auxiliar)) {
        $tempNum = $this->NumColumnas();
        $i=0;
        $meta;
        $arreglo;
        while($i < $tempNum){
            $meta=mysql_fetch_field($this->resultado, $i);
            $arreglo[]=array(
                'blob'=>$meta->blob
                ,'max_length'=>$meta->max_length
                ,'multiple_key'=>$meta->multiple_key
                ,'name'=>$meta->name
                ,'not_null'=>$meta->not_null
                ,'numeric'=>$meta->numeric
                ,'primary_key'=>$meta->primary_key
                ,'table'=>$meta->table
                ,'unique_key'=>$meta->unique_key
                ,'unsigned'=>$meta->unsigned
                ,'zerofill'=>$meta->zerofill
            );
            $i++;
        }
        $this->fetchField=$arreglo;
        return $this->fetchField;
        }else {
            return Core::MsgError("Error, la tabla '$nombreTabla' pasada como "
                ."parametro al metodo 'FetchField()' no existe. "
                ."Mensaje de MySQL: ".mysql_errno($this->punteroBD)." - ".mysql_error($this->punteroBD));
        }
    }

}// Fin de Metodo

public function getInsertId() {
    if (!empty ($this->punteroBD)) {
        $ultimoId = mysql_insert_id($this->punteroBD);
        return $ultimoId;
    }else {
        return false;;
    }
}

public function Free($resultado){
    if (mysql_free_result($resultado)) {
        return true;
    }else {
        return false;
    }
    
}// Fin del Metodo

public function Close($puntero) {
    if (mysql_close($puntero)) {
        return true;
    }else {
        return false;
    }
}// Fin del Metodo.

}//Fin de la clase
?>
